package com.carsa.blackberry.domain.services.webServices;

import java.util.Vector;

import com.carsa.blackberry.MainKeys;
import com.carsa.blackberry.domain.dto.QueueMessageDTO;
import com.carsa.blackberry.util.Logger;

/**
 * @author Nahuel Barrios.
 * @since 11/08/2010.
 * @version 1.0
 */
public class WebServiceManager {

    /**
     * @param key
     *            El nombre de un Web Service del cual queremos obtener su Objeto.
     * @return El {@link WebService} correspondiente para la key seteada.
     */
    public WebService doMapping(String key) {
	if (key == null)
	    return null;

	if (key.equals(MainKeys.WS_NAME_ZSDARE_ARE))
	    return new ZSdareAre_Service();
	else if (key.equals(MainKeys.WS_NAME_ZSDARE_MOTIVOS))
	    return new ZSdareMotivos_Service();
	else if (key.equals(MainKeys.WS_NAME_ZSDARE_LEGAJOS))
	    return new ZSdareLegajos_Service();
	else if (key.equals(MainKeys.WS_NAME_ZSDARE_ENTREGA))
	    return new ZSdareEntrega_Service();

	return null;
    }

    public Object call(WebService aWebService) {
	return this.call(aWebService, null);
    }

    /**
     * @param aWebService
     *            Una instancia del {@link WebService} que se va a ejecutar.
     * @param parameters
     *            Los parametros que debe recibir el Web Service. Minimamente debe implementarse que sea un
     *            {@link String} en formato XML, o un {@link Vector}.
     * @return El resultado de invocar al WebService. O <code>null</code> si hubo algun error y no se pudo ejecutar la
     *         llamada al Web Service correctamente. En caso de que el Web Service no devuelva nada, entonces el metodo
     *         debe retornar un {@link Boolean} con el valor <code>true</code>.
     */
    public Object call(WebService aWebService, Object parameters) {
	if (aWebService != null) {
	    Logger.logInfo("Se invocara al WebService: " + aWebService.getName());

	    if (parameters != null)
		return aWebService.invokeWebService(parameters);
	    else
		return aWebService.invokeWebService();
	}
	Logger.logInfo("No se pudo realizar el mapeo para el WebService. Compruebe que existe en WebServiceManager.doMapping()");

	return null;
    }

    /**
     * @param webServiceName
     *            Un {@link String} con el nombre del Web Service. Deberia ser unico para toda la aplicacion.
     * @param parameters
     *            Los parametros que debe recibir el Web Service en formato XML a travez de un objeto {@link String}.
     * @return El resultado de invocar al WebService. O <code>null</code> si hubo algun error y no se pudo ejecutar la
     *         llamada al Web Service correctamente. En caso de que el Web Service no devuelva nada, entonces el metodo
     *         debe retornar un {@link Boolean} con el valor <code>true</code>.
     */
    public Object call(String webServiceName, String parameters) {
	return this.call(this.doMapping(webServiceName), parameters);
    }

    /**
     * @param aMessage
     *            Un {@link QueueMessageDTO} conteniendo la informacion que se va a persistir.
     * @return <code>true</code> cuando la informacion se haya persistido correctamente. <code>false</code> en otro
     *         caso.
     */
    public boolean persist(QueueMessageDTO aMessage) {
	if (aMessage == null)
	    return false;

	Object returnValue = this.call(aMessage.getWebServiceName(), aMessage.getParameters());
	return returnValue != null;
    }

}
